import { Injectable, UnauthorizedException } from '@nestjs/common';
import { UserService } from '../user/user.service';
import * as bcrypt from 'bcrypt';
import { JwtService } from '@nestjs/jwt';
import { resFormatMethod } from '../../utils/res-format';

@Injectable()
export class AuthService {
  constructor(
    private readonly userService: UserService,
    private jwtService: JwtService
  ) {}

  async login(username: string, password: string) {
    try {
      // 1. 直接调用userService的findByUsername方法查找用户
      const user = await this.userService.findByUsername(username);

      // 2. 检查用户是否存在
      if (!user) {
        throw new UnauthorizedException('用户名不存在');
      }

      // 3. 验证密码（使用bcrypt比较）
      const isPasswordValid = await bcrypt.compare(password, user.password);

      if (!isPasswordValid) {
        throw new UnauthorizedException('密码错误');
      }
      const payload = { username, id: user.id };
      // 4. 生成JWT token
      const token = this.jwtService.sign(payload);

      // 4. 返回成功结果（不包含密码）
      return resFormatMethod(
        0, // 0表示成功
        '登录成功', // 成功消息
        {
          // 登录成功的用户数据
          id: user.id,
          token: token, // JWT token
          timestamp: new Date().toISOString(),
        }
      );
    } catch (error) {
      // 错误会被HttpExceptionFilter拦截并格式化返回
      if (error instanceof UnauthorizedException) {
        throw error; // 直接抛出，让过滤器处理
      }

      // 其他未知错误
      throw new UnauthorizedException('登录失败，请稍后重试');
    }
  }
}
